#ifndef TESTPARSERSOAP_H_
#define TESTPARSERSOAP_H_


#include <stdio.h>

#include <libxml/parser.h>  /*trabaja con los ficheros xml*/
#include <libxml/tree.h>    /*trabaja con el árbol generado de parsear el xml*/

#include "../XML/ParserXml.h"
#include "../Comunicaciones/Servidor.h"
#include "../Comunicaciones/Cliente.h"
#include "empaquetadorSoap.h"
#include "DesempaquetadorSoap.h"
#include "ParserSoap.h"
/******************************************************************************************************/
/*******   CLASE PARA TESTEO DE PROTOCOLO SOAP Y CONEXION CLIENTE-SERVIDOR 	  *************************/
/******************************************************************************************************/
class TestParserSoap{
public:
	int run()
	{
		std::cout<<">>>Probando Empaquetado SOAP<<<"<<std::endl;

		char* rutaArchivo = (char*)"./XML/complejoSoap.xml\0";
		char* rutaArchivo2 = (char*)"./SOAP/empaquetado.xml\0";
		char* rutaArchivo3 = (char*)"./SOAP/desempaquetado.xml\0";
		empaquetadorSoap pSOAP;
		xmlDocPtr doc;
		doc = pSOAP.empaquetar(rutaArchivo);

		if (doc!= NULL)
		xmlSaveFile(rutaArchivo2, doc);

		std::cout<<">>>Probando DesEmpaquetado SOAP<<<"<<std::endl;

		DesempaquetadorSoap pSOAPdes;
		xmlDocPtr docDes;
		docDes = pSOAPdes.Desempaquetar(rutaArchivo2);

		if (docDes != NULL)
			xmlSaveFile(rutaArchivo3, docDes);

		std::cout<<"<<<-Empiezo Servidor->>>"<<std::endl;
		Servidor server((char*)"4548");
		server.start();

		std::cout<<"<<<-Creo Cliente->>>"<<std::endl;
		Cliente cliente;

//-------Pruebo Simulacion---//
		std::cout<< "Probando Simulacion: " <<std::endl;
		std::string msj = cliente.obtener_salida("127.0.0.1", 4548, rutaArchivo, "1001");

		std::cout << "las salidas obtenidas son: " << msj << std::endl;
//-------Fin Prueba Simulacion---//

//-------Pruebo Obtener Datos---//
		std::cout<< "Probando obteniendo datos: " <<std::endl;
		int  entradas;
		int  salidas;
		cliente.obtener_datos("127.0.0.1", 4548, rutaArchivo, entradas, salidas);

		std::cout << "entradas son " << entradas << std::endl;
		std::cout << "salidas son " << salidas << std::endl;
//-------Fin Prueba Obtener Datos---//

//-------Prueba Explosion---//
		std::cout<< "Probando Explosion: " <<std::endl;
		char * rutaPrueba = cliente.mostrar_circuito("127.0.0.1", 4548, rutaArchivo);

		if(rutaPrueba != NULL){
			std::string * nombre = new std::string;
			Circuito * circuito;
			ParserXml xml;
			std::list<Compuerta*> * pListaCompuertas;
			std::list<Entrada*> * pListaEntradas;
			std::list<Salida*> * pListaSalidas;
			std::list<Cable*>* pListaCables;

			pListaCompuertas = new std::list<Compuerta*>;
			pListaEntradas = new std::list<Entrada*>;
			pListaSalidas = new std::list<Salida*>;
			pListaCables = new std::list<Cable*>;
			std::list<ElementoExterno*>* pListaExternos;
			pListaExternos = new std::list<ElementoExterno*>;

			xml.obtener_Desde_Archivo(rutaPrueba, pListaCompuertas,pListaEntradas,pListaSalidas, pListaCables
							, pListaExternos, nombre);

			circuito = new Circuito (pListaEntradas, pListaSalidas, pListaCompuertas, pListaCables,pListaExternos, *nombre);

			std::cout<< "Pruebo simule correctamente una vez obtenido: " <<std::endl;
			std::cout << circuito->simular() <<std::endl;
			delete circuito;

		}
		//-------Fin Prueba Simulacion---//

		std::cout << "Fin de pruebas.."<< std::endl << "cerrando servidor.."<< std::endl;
		server.terminar();
		server.Shutdown(2);
		server.Close();
		server.join();
		if(server.isOK())
			return 0;
		else
			return 1;
	}
};
#endif /* TESTPARSERSOAP_H_ */
